package com.jrx.anytxn.transaction.mapper.ext;

import com.jrx.anytxn.transaction.entity.AmDelinquencyInfo;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;

/**
 * 延滞信息表dao扩展
 *
 * @author jing.xiaoyu
 * date  2019/10/14
 **/
public interface ExtAmDelinquencyInfoMapper {

    /**
     * 根据条件查询账户信息
     *
     * @param loanId
     * @param customerId
     * @param tenantId
     * @param billingTenor
     * @param status
     * @return
     */
    AmDelinquencyInfo selectDelqInfo(@Param("loanId") String loanId,
                                     @Param("customerId") String customerId,
                                     @Param("tenantId") String tenantId,
                                     @Param("billingTenor") Integer billingTenor,
                                     @Param("status") String status);

    /**
     * 批量更新账户信息（作用于批量）
     *
     * @param amDelinquencyInfos
     * @return
     */
    int batchUpdateAccountForBatch(List<AmDelinquencyInfo> amDelinquencyInfos);

    /**
     * 批量更新账户信息（作用于联机）
     *
     * @param amDelinquencyInfos
     * @return
     */
    int batchUpdateAccount(List<AmDelinquencyInfo> amDelinquencyInfos);

    /**
     * 批量保存账户信息
     *
     * @param saveDelqList
     * @return
     */
    int batchInsertAccount(List<AmDelinquencyInfo> saveDelqList);

    /**
     * 根据订单id查询逾期信息
     *
     * @param loanId
     * @param customerId
     * @param tenantId
     * @param statusList
     * @return
     */
    List<AmDelinquencyInfo> selectDelqInfoByLoanId(@Param("loanId") String loanId,
                                                   @Param("customerId") String customerId,
                                                   @Param("tenantId") String tenantId,
                                                   @Param("statusList") List<String> statusList);

    /**
     * 根据状态查询延滞账户
     *
     * @param accountStatus
     * @return
     */
    List<AmDelinquencyInfo> selectByAccountStatus(@Param("accountStatus") String accountStatus);

    /**
     * 获取借据最早逾期信息
     *
     * @param loanId
     * @param customerId
     * @param tenantId
     * @return
     */
    AmDelinquencyInfo getMinAmDelinquencyInfo(@Param("loanId") String loanId,
                                              @Param("customerId") String customerId,
                                              @Param("tenantId") String tenantId);

    /**
     * 根据账户id获取逾期信息
     *
     * @param accountId 账户id
     * @param tenantId  租户id
     * @return AmDelinquencyInfo
     */
    AmDelinquencyInfo selectByAccountId(@Param("accountId") String accountId, @Param("tenantId") String tenantId);

    /**
     * 根据条件查询最早逾期信息
     *
     * @param loanId
     * @param customerId
     * @param tenantId
     * @param accountStatus
     * @return
     */
    AmDelinquencyInfo getMinDelqByStatus(@Param("loanId") String loanId,
                                         @Param("customerId") String customerId,
                                         @Param("tenantId") String tenantId,
                                         @Param("accountStatus") String accountStatus);

    /**
     * 获取借据最大逾期信息
     *
     * @param customerId
     * @param tenantId
     * @return
     */
    AmDelinquencyInfo getMaxDelqDaysInfo(@Param("customerId") String customerId,
                                         @Param("tenantId") String tenantId,
                                         @Param("accountStatus") String accountStatus);
    /**
     * 获取借据最大逾期信息
     *
     * @param customerId
     * @param tenantId
     * @return
     */
    AmDelinquencyInfo getMaxDelqDaysInfoWithProducts(@Param("customerId") String customerId,
                                                     @Param("tenantId") String tenantId,
                                                     @Param("accountStatus") String accountStatus,
                                                     @Param("productIds") List<String> productIds);

    /**
     * 按照期次统计逾期次数
     *
     * @param customerId
     * @param tenantId
     * @return
     */
    Integer groupByCustomerId(@Param("customerId") String customerId,
                              @Param("tenantId") String tenantId);
    /**
     * 按照期次统计逾期次数
     *
     * @param customerId
     * @param tenantId
     * @param etlEffectiveDate
     * @return
     */
    Integer groupByCustomerIdWithProducts(@Param("customerId") String customerId,
                                          @Param("tenantId") String tenantId,
                                          @Param("productIds") List<String> productIds,
                                          @Param("etlEffectiveDate") Date etlEffectiveDate);

    /**
     * 按照客户下所有逾期未关闭期数集合
     *
     * @param customerId
     * @param tenantId
     * @return
     */
    List<AmDelinquencyInfo> groupByCustomerIdList(@Param("customerId") String customerId,
                                  @Param("tenantId") String tenantId);

    /**
     * 获取最大逾期信息和最早逾期日
     * @param loanId
     * @param customerId
     * @param tenantId
     * @param accountStatus
     * @return
     */
    AmDelinquencyInfo getDelqDaysInfo(@Param("loanId")String loanId, @Param("customerId")String customerId, @Param("tenantId")String tenantId, @Param("accountStatus")String accountStatus ,@Param("businessDate") Date businessDate);

    /**
     * 额度效期内是否出现的最大逾期天数
     *
     * @param limitEffectiveDate
     * @param expiryDate
     * @param customerId
     * @param tenantId
     * @return
     */
    Integer daysOverdueInExpiryDate(@Param("limitEffectiveDate") Date limitEffectiveDate, @Param("expiryDate") Date expiryDate, @Param("customerId") String customerId, @Param("tenantId") String tenantId);

    /**
     * 按照贷款订单ID期次统计逾期次数
     *
     * @param customerId
     * @param tenantId
     * @param etlEffectiveDate
     * @return
     */
    Integer groupByloanIdWithProducts(@Param("customerId") String customerId,
                                          @Param("tenantId") String tenantId,
                                          @Param("loanId")String loanId,
                                          @Param("productIds") List<String> productIds,
                                          @Param("etlEffectiveDate") Date etlEffectiveDate);

    /**
     * 根据贷款订单ID 获取借据最大逾期信息
     *
     * @param customerId
     * @param tenantId
     * @return
     */
    AmDelinquencyInfo getByLoanIdMaxDelqDaysInfoWithProducts(@Param("customerId") String customerId,
                                                     @Param("tenantId") String tenantId,
                                                     @Param("loanId")String loanId,
                                                     @Param("accountStatus") String accountStatus,
                                                     @Param("productIds") List<String> productIds);

}
